home *** CD-ROM | disk | FTP | other *** search
- Andreas Papula
- Römerstraße 20
- 6200 Wiesbaden - Delkenheim
-
- Dokumentation zu EASYFSEL.C Version 1.27
- Datum: 15.06.1992
-
-
- Jeder, der auf dem ATARI ST/STE/TT Programme unter GEM schreibt,
- kam sicherlich schon einmal mit der Fileselectorbox und deren
- Programmierung in Berührung.
- Schon die Funktion fsel_input ist nicht sonderlich leicht zu
- handhaben, da man erst die Rückgabeparameter auswerten und dann
- noch den vollständigen Zugriffspfad zusammenbasteln muß [1].
- Ab TOS 1.04 bzw. AES 1.4 gibt es dann noch die Version fsel_exinput,
- der zusätzlich ein Titel übergeben wird. Man sollte also wenn
- möglich diese Funktion benutzen, da man so den Anwender
- informieren kann, was er mit der Fileselectorbox auswählen soll.
- Ein gutes Beispiel für so einen Titel wäre z.B. "Bitte zu
- öffnende Datei auswählen" oder so etwas ähnliches.
- Viele Programmierer wissen nun aber nicht, wie man in eigenen
- Programmen überprüfen kann, ob fsel_exinput() überhaupt vorhanden
- ist und verwendet werden darf.
- Zusätzlich zu dieser Problematik existiert noch der 'FSEL'-Cookie
- des alternativen Fileselectors "Selectric" (Shareware), der
- anzeigt, das unter jeder TOS- bzw. AES-Version fsel_exinput()
- vorhanden ist.
-
-
- Die Routinen...
- ---------------
-
- Ziel war es, eine kleine (aber feine) Routinensammlung zu
- entwickeln, die den Programmierer dabei unterstützt, die
- Fileselectorbox korrekt auf den Bildschirm zu bringen, inkl.
- Abfrage des 'FSEL'-Cookies. Nun ja, EASYFSEL.C stellt nun genau
- so eine Routinensammlung dar, die auch noch über einige weitere
- Routinen, etwa Abfrage eines Cookies etc., verfügt.
- Doch zuerst möchte ich die eigentliche Hauptroutine vorstellen,
- easy_fsel(). Der Funktionsprototyp (in der Datei EASYFSEL.H)
- lautet wie folgt:
-
- BOOLEAN easy_fsel(BYTE *pfad, BYTE *dateiname, BYTE *text);
-
- pfad ist dabei ein Zeiger auf einen String, der den Pfad enthält,
- mit dem fsel_input() bzw. fsel_exinput aufgerufen wird. Nach dem
- Ende der Funktion enthält pfad dann den vom Benutzer ausgewählten
- Pfad. Entsprechendes gilt für dateiname. text ist der Titel, der
- bei fsel_exinput() erscheint.
- Der Rückgabewert der Funktion ist TRUE, wenn der Benutzer 'OK'
- ausgewählt hat und kein Fehler aufgetreten ist; FALSE, wenn
- 'ABBRUCH' ausgewählt wurde oder ein Fehler aufgetreten ist.
- Der neuen Datentyp BOOLEAN ist in EASYFSEL.H wie folgt definiert:
-
- typedef enum
- {
- FALSE,
- TRUE
- } BOOLEAN;
-
- Diesen Datentyp werden wird noch bei einigen Funktionen benutzen;
- er ist ganz nützlich und Sie können ihn auch in eigenen
- Funktionen verwenden.
- easy_fsel() geht nun wie folgt vor:
- Zuerst werden (logisch) die benutzten Variablen deklariert, dann
- wird, wenn die AES-Version kleiner 0x0014 ist oder der 'FSEL'-
- Cookie nicht gefunden wurde, fsel_input aufgerufen, ansonsten
- fsel_exinput(). Die Parameter dieser beiden Funktionen möchte ich
- hier erklären, da diese für die Benutzung der Routinensammlung
- unerheblich sind und zweitens in [1] sehr gut beschrieben sind.
- Die AES-Version steht im ersten Element des global-Feldes. Um an
- das global-Feld heran zu kommen, muß man folgende Deklaration in
- sein Programm aufnehmen:
-
- extern GEMPARBLK _GemParBlk;
-
- Damit wird eine Variable namens _GemParBlk vom Typ der Struktur
- GEMPARBLK deklariert. Diese Variable wird vom Startup-Code des
- PURE C-Compilers bereitgestellt. Achten Sie also darauf, wenn Sie
- einen anderen Startup-Code als einen der drei Originalen
- verwenden, daß die von Ihnen favorisierte Version sich in diesem
- Punkt genauso wie die Originale verhält! Auf global[] kann man
- dann wie folgt zugreifen:
-
- _GemParBlk.global()
-
- Das Suchen des Cookies übernimmt eine universell einsetzbare
- Routine namens get_cookie(), die besonders dazu geeignet ist, zu
- überprüfen, ob ein Cookie vorhanden ist. Ich werde weiter unten
- noch genauer auf get_cookie() eingehen, doch zunächst zurück zu
- easy_fsel(): Nachdem also fsel_input() oder fsel_exinput()
- aufgerufen worden sind, wird die Auswertung der Rückgabeparameter
- vorgenommen. Wenn der gedrückte Knopf 'Abbruch' ist oder ein
- fehler aufgetreten ist, wird FALSE zurückgegeben, ansonsten TRUE.
- Die aufrufende Funktion findet nun in pfad und dateiname die vom
- Benutzer gemachten Eingaben vor und kann diese nun per
- build_filename() zu einem gültigen Zugriffspfad zusammensetzen.
- build_filename() ist in EASYFSEL.H wie folgt deklariert:
-
- VOID build_filename(BYTE *dest, BYTE *pfad, BYTE *dateiname);
-
- Übergeben wird ein Zeiger auf einen String, der den kompletten
- Zugriffspfad nach Beendigung der Funktion enthält, ein Zeiger auf
- den Pfad und ein Zeiger auf den Dateinamen, aus denen der
- Zugriffspfad zusammengebastelt werden soll. Die Routine ist
- eigentlich selbsterklärend, so daß ich auf eine Beschreibung der
- Arbeitsweise hier verzichte.
-
- Des weiteren befindet sich noch die Funktion exist() in der
- Sammlung, mit der es möglich ist, festzustellen, ob eine Datei
- existiert. der Prototyp sieht wie folgt aus:
-
- BOOLEAN exist(const BYTE *dateiname);
-
- Die Funktion tätigt einen Aufruf der Funktion Fsfirst() und gibt,
- falls die Datei im Verzeichnis gefunden wurde, TRUE zurück,
- anderfalls FALSE. Gesucht wird dabei nach Dateien, die die
- Attribute 'READONLY', 'HIDDEN', 'SYSTEM' oder 'ARCHIVE' besitzen.
-
- Auch die Funktion get_akt_path() ist sicherlich hilfreich; sie
- liefert den aktuellen Pfad zusammen mit dem aktuellen Laufwerk,
- z. B. "D:\PC\SOURCEN\GEM".
- Übergeben wird ihr ein Zeiger auf einen String, in dem der Pfad
- dann stehen soll. Zurückgeliefert wird ein Zeiger auf eben diesen
- String.
- Es werden Aufrufe der PURE C - Spezialfunktionen getcurdir() und
- getdisk() getätigt und aus deren Ergebnissen wird dann der
- aktuelle Pfad mit dem aktuellen Laufwerk zusammengebastelt.
- get_akt_path() ist in EASYFSEL.H wie folgt deklariert:
-
- BYTE *get_akt_path(BYTE *path);
-
-
- Cookie gesucht
- --------------
- Nun kommen wir zur letzten Funktion, nämlich get_cookie(), die
- ich weiter oben schon mal angesprochen habe. Ich möchte hier
- allerdings nicht den prinziellen Aufbau des Cookiejar
- wiederholen, dieser ist z.B. in [1] oder [2] erläutert.
- Zunächst wird im Supervisor.Modus ein Zeiger auf den Cookiejar
- geholt. Wenn dort NULL steht, d.h. der Cookiejar leer ist, wird
- FALSE zurückgegeben. Andernfalls wird der Cookiejar solange
- durchlaufen, bist der gewünschte Cookie gefunden wird oder ein
- NULL-Zeiger vorkommt, d.h. der Cookiejar komplett durchlaufen
- wurde.
- Wenn der Cookie gefunden wurde, wird TRUE zurückgegeben und der
- Wert des Cookies der übergebenen Variable cookie_value
- zugewiesen. Wenn der Cookie nicht auffinderbar ist, wird FALSE
- zurückgegeben. Jetzt noch schnell der Prototyp von get_cookie():
-
- BOOLEAN get_cookie(BYTE *cookie_name, LONG *cookie_value);
-
- Wenn Sie nun beispielsweise überprüfen wollen, ob der 'VSCR'-
- Cookie (wird von BigScreen2, SciLab GmbH, gesetzt) vorhanden ist,
- können Sie also wie folgt vorgehen:
-
- ...
- long cookie_value = 0;
-
- if(get_cookie("VSRC", &cookie_value) == TRUE)
- {
- /* Cookie gefunden, Wert steht in cookie_value */
- ...
- }
- else
- {
- ...
- }
-
-
- Was bleibt ?
- ------------
- ... ist eine Routinensammlung, die man, sofern man Programme
- schreibt, die in irgendeiner Form mit Dateien zu tun haben, immer
- wieder verwenden kann und einem viel Gehirnschmalz erspart. Bei
- mir ist EASYFSEL.C nun schon einige Wochen im Einsatz und ich bin
- wirklich froh, daß ich mir die Mühe gemacht habe und mir eine
- wirklich universell einsetzbare Routinensammlung geschrieben
- habe. Das Modulkonzept von PURE C mit der guten Unterstützung
- durch den Projectmanager macht es einem wirklich leicht, modular
- aufgebaute Programme zu entwickeln und Module zu schreiben, die
- man immer wieder verwenden kann.
- Um in eigenen Programmen EASYFSEL.C verwenden zu können, müssen
- Sie EASYFSEL.H mittels #include in Ihre Programme einfügen und in
- die jeweilige Projectdatei EASYFSEL.C aufnehmen.
-
- Literaturhinweise:
- [1] Jankowski, Reschke, Rabich: ATARI Profibuch ST/STE/TT, Sybex 1991
- [2] "STEE-Gebäck - Das Cookie-Jar-Prinzip", ST-Computer 10/90, Seite 151-153
-
-
-